;;;; Copyright (c) 2011-2016 Henry Harrington <henry.harrington@gmail.com>
;;;; This code is licensed under the MIT license.

(in-package :mezzano.gui.compositor)

(defclass simple-keymap ()
  ((%name :initarg :name :reader name)
   (%untranslated-modifiers :initarg :untranslated-modifiers :accessor untranslated-modifiers :initform nil)
   (%unshifted :initarg :unshifted :reader keymap-unshifted-map)
   (%shifted :initarg :shifted :reader keymap-shifted-map)
   (%shifted2 :initarg :shifted2 :reader keymap-shifted2-map :initform '())))

(defmethod print-object ((obj simple-keymap) stream)
  (print-unreadable-object (obj stream :type t :identity t)
    (format stream "~A" (name obj))))

(defvar *keymap-list* (list))

(defmethod initialize-instance :after ((map simple-keymap) &key)
  (pushnew map *keymap-list* :key #'(lambda (x) (name x)) :test #'string=))

(defparameter *engb-keymap*
  (make-instance 'simple-keymap
                 :name "En-GB"
                 :unshifted '((#\0 . #\0)
                              (#\1 . #\1)
                              (#\2 . #\2)
                              (#\3 . #\3)
                              (#\4 . #\4)
                              (#\5 . #\5)
                              (#\6 . #\6)
                              (#\7 . #\7)
                              (#\8 . #\8)
                              (#\9 . #\9)
                              (#\A . #\a)
                              (#\B . #\b)
                              (#\C . #\c)
                              (#\D . #\d)
                              (#\E . #\e)
                              (#\F . #\f)
                              (#\G . #\g)
                              (#\H . #\h)
                              (#\I . #\i)
                              (#\J . #\j)
                              (#\K . #\k)
                              (#\L . #\l)
                              (#\M . #\m)
                              (#\N . #\n)
                              (#\O . #\o)
                              (#\P . #\p)
                              (#\Q . #\q)
                              (#\R . #\r)
                              (#\S . #\s)
                              (#\T . #\t)
                              (#\U . #\u)
                              (#\V . #\v)
                              (#\W . #\w)
                              (#\X . #\x)
                              (#\Y . #\y)
                              (#\Z . #\z)
                              (#\- . #\-)
                              (#\= . #\=)
                              (#\[ . #\[)
                              (#\] . #\])
                              (#\; . #\;)
                              (#\' . #\')
                              (#\` . #\`)
                              (#\# . #\#)
                              (#\, . #\,)
                              (#\. . #\.)
                              (#\/ . #\/)
                              (#\\ . #\\)
                              (#\Esc . #\Esc)
                              (#\Backspace . #\Backspace)
                              (#\Tab . #\Tab)
                              (#\Newline . #\Newline)
                              (#\Space . #\Space)
                              (#\F1 . #\F1)
                              (#\F2 . #\F2)
                              (#\F3 . #\F3)
                              (#\F4 . #\F4)
                              (#\F5 . #\F5)
                              (#\F6 . #\F6)
                              (#\F7 . #\F7)
                              (#\F8 . #\F8)
                              (#\F9 . #\F9)
                              (#\F10 . #\F10)
                              (#\F11 . #\F11)
                              (#\F12 . #\F12)
                              (#\KP-0 . #\0)
                              (#\KP-1 . #\1)
                              (#\KP-2 . #\2)
                              (#\KP-3 . #\3)
                              (#\KP-4 . #\4)
                              (#\KP-5 . #\5)
                              (#\KP-6 . #\6)
                              (#\KP-7 . #\7)
                              (#\KP-8 . #\8)
                              (#\KP-9 . #\9)
                              (#\KP-Minus . #\-)
                              (#\KP-Plus . #\+)
                              (#\KP-Period . #\.)
                              (#\KP-Multiply . #\*)
                              (#\KP-Divide . #\\)
                              (#\KP-Enter . #\Newline)
                              (#\Menu . #\Menu)
                              (#\Insert . #\Insert)
                              (#\Home . #\Home)
                              (#\Page-Up . #\Page-Up)
                              (#\Delete . #\Delete)
                              (#\End . #\End)
                              (#\Page-Down . #\Page-Down)
                              (#\Up-Arrow . #\Up-Arrow)
                              (#\Left-Arrow . #\Left-Arrow)
                              (#\Down-Arrow . #\Down-Arrow)
                              (#\Right-Arrow . #\Right-Arrow))
                 :shifted '((#\0 . #\))
                            (#\1 . #\!)
                            (#\2 . #\")
                            (#\3 . #\£)
                            (#\4 . #\$)
                            (#\5 . #\%)
                            (#\6 . #\^)
                            (#\7 . #\&)
                            (#\8 . #\*)
                            (#\9 . #\()
                            (#\A . #\A)
                            (#\B . #\B)
                            (#\C . #\C)
                            (#\D . #\D)
                            (#\E . #\E)
                            (#\F . #\F)
                            (#\G . #\G)
                            (#\H . #\H)
                            (#\I . #\I)
                            (#\J . #\J)
                            (#\K . #\K)
                            (#\L . #\L)
                            (#\M . #\M)
                            (#\N . #\N)
                            (#\O . #\O)
                            (#\P . #\P)
                            (#\Q . #\Q)
                            (#\R . #\R)
                            (#\S . #\S)
                            (#\T . #\T)
                            (#\U . #\U)
                            (#\V . #\V)
                            (#\W . #\W)
                            (#\X . #\X)
                            (#\Y . #\Y)
                            (#\Z . #\Z)
                            (#\- . #\_)
                            (#\= . #\+)
                            (#\[ . #\{)
                            (#\] . #\})
                            (#\; . #\:)
                            (#\' . #\@)
                            (#\` . #\¬)
                            (#\# . #\~)
                            (#\, . #\<)
                            (#\. . #\>)
                            (#\/ . #\?)
                            (#\\ . #\|)
                            (#\Esc . #\Esc)
                            (#\Backspace . #\Backspace)
                            (#\Tab . #\Tab)
                            (#\Newline . #\Newline)
                            (#\Space . #\Space)
                            (#\F1 . #\F1)
                            (#\F2 . #\F2)
                            (#\F3 . #\F3)
                            (#\F4 . #\F4)
                            (#\F5 . #\F5)
                            (#\F6 . #\F6)
                            (#\F7 . #\F7)
                            (#\F8 . #\F8)
                            (#\F9 . #\F9)
                            (#\F10 . #\F10)
                            (#\F11 . #\F11)
                            (#\F12 . #\F12)
                            (#\KP-0 . #\0)
                            (#\KP-1 . #\1)
                            (#\KP-2 . #\2)
                            (#\KP-3 . #\3)
                            (#\KP-4 . #\4)
                            (#\KP-5 . #\5)
                            (#\KP-6 . #\6)
                            (#\KP-7 . #\7)
                            (#\KP-8 . #\8)
                            (#\KP-9 . #\9)
                            (#\KP-Minus . #\-)
                            (#\KP-Plus . #\+)
                            (#\KP-Period . #\.)
                            (#\KP-Multiply . #\*)
                            (#\KP-Divide . #\\)
                            (#\KP-Enter . #\Newline)
                            (#\Menu . #\Menu)
                            (#\Insert . #\Insert)
                            (#\Home . #\Home)
                            (#\Page-Up . #\Page-Up)
                            (#\Delete . #\Delete)
                            (#\End . #\End)
                            (#\Page-Down . #\Page-Down)
                            (#\Up-Arrow . #\Up-Arrow)
                            (#\Left-Arrow . #\Left-Arrow)
                            (#\Down-Arrow . #\Down-Arrow)
                            (#\Right-Arrow . #\Right-Arrow))
                 :shifted2 '((#\4 . #\€)
                             (#\A . #\á)
                             (#\E . #\é)
                             (#\I . #\í)
                             (#\U . #\ú))))

(defparameter *enus-keymap*
  (make-instance 'simple-keymap
                 :name "En-US"
                 :unshifted '((#\0 . #\0)
                              (#\1 . #\1)
                              (#\2 . #\2)
                              (#\3 . #\3)
                              (#\4 . #\4)
                              (#\5 . #\5)
                              (#\6 . #\6)
                              (#\7 . #\7)
                              (#\8 . #\8)
                              (#\9 . #\9)
                              (#\A . #\a)
                              (#\B . #\b)
                              (#\C . #\c)
                              (#\D . #\d)
                              (#\E . #\e)
                              (#\F . #\f)
                              (#\G . #\g)
                              (#\H . #\h)
                              (#\I . #\i)
                              (#\J . #\j)
                              (#\K . #\k)
                              (#\L . #\l)
                              (#\M . #\m)
                              (#\N . #\n)
                              (#\O . #\o)
                              (#\P . #\p)
                              (#\Q . #\q)
                              (#\R . #\r)
                              (#\S . #\s)
                              (#\T . #\t)
                              (#\U . #\u)
                              (#\V . #\v)
                              (#\W . #\w)
                              (#\X . #\x)
                              (#\Y . #\y)
                              (#\Z . #\z)
                              (#\- . #\-)
                              (#\= . #\=)
                              (#\[ . #\[)
                              (#\] . #\])
                              (#\; . #\;)
                              (#\' . #\')
                              (#\` . #\`)
                              (#\# . #\\)
                              (#\, . #\,)
                              (#\. . #\.)
                              (#\/ . #\/)
                              (#\Esc . #\Esc)
                              (#\Backspace . #\Backspace)
                              (#\Tab . #\Tab)
                              (#\Newline . #\Newline)
                              (#\Space . #\Space)
                              (#\F1 . #\F1)
                              (#\F2 . #\F2)
                              (#\F3 . #\F3)
                              (#\F4 . #\F4)
                              (#\F5 . #\F5)
                              (#\F6 . #\F6)
                              (#\F7 . #\F7)
                              (#\F8 . #\F8)
                              (#\F9 . #\F9)
                              (#\F10 . #\F10)
                              (#\F11 . #\F11)
                              (#\F12 . #\F12)
                              (#\KP-0 . #\0)
                              (#\KP-1 . #\1)
                              (#\KP-2 . #\2)
                              (#\KP-3 . #\3)
                              (#\KP-4 . #\4)
                              (#\KP-5 . #\5)
                              (#\KP-6 . #\6)
                              (#\KP-7 . #\7)
                              (#\KP-8 . #\8)
                              (#\KP-9 . #\9)
                              (#\KP-Minus . #\-)
                              (#\KP-Plus . #\+)
                              (#\KP-Period . #\.)
                              (#\KP-Multiply . #\*)
                              (#\KP-Divide . #\\)
                              (#\KP-Enter . #\Newline)
                              (#\Menu . #\Menu)
                              (#\Insert . #\Insert)
                              (#\Home . #\Home)
                              (#\Page-Up . #\Page-Up)
                              (#\Delete . #\Delete)
                              (#\End . #\End)
                              (#\Page-Down . #\Page-Down)
                              (#\Up-Arrow . #\Up-Arrow)
                              (#\Left-Arrow . #\Left-Arrow)
                              (#\Down-Arrow . #\Down-Arrow)
                              (#\Right-Arrow . #\Right-Arrow))
                 :shifted '((#\0 . #\))
                            (#\1 . #\!)
                            (#\2 . #\@)
                            (#\3 . #\#)
                            (#\4 . #\$)
                            (#\5 . #\%)
                            (#\6 . #\^)
                            (#\7 . #\&)
                            (#\8 . #\*)
                            (#\9 . #\()
                            (#\A . #\A)
                            (#\B . #\B)
                            (#\C . #\C)
                            (#\D . #\D)
                            (#\E . #\E)
                            (#\F . #\F)
                            (#\G . #\G)
                            (#\H . #\H)
                            (#\I . #\I)
                            (#\J . #\J)
                            (#\K . #\K)
                            (#\L . #\L)
                            (#\M . #\M)
                            (#\N . #\N)
                            (#\O . #\O)
                            (#\P . #\P)
                            (#\Q . #\Q)
                            (#\R . #\R)
                            (#\S . #\S)
                            (#\T . #\T)
                            (#\U . #\U)
                            (#\V . #\V)
                            (#\W . #\W)
                            (#\X . #\X)
                            (#\Y . #\Y)
                            (#\Z . #\Z)
                            (#\- . #\_)
                            (#\= . #\+)
                            (#\[ . #\{)
                            (#\] . #\})
                            (#\; . #\:)
                            (#\' . #\")
                            (#\` . #\~)
                            (#\# . #\|)
                            (#\, . #\<)
                            (#\. . #\>)
                            (#\/ . #\?)
                            (#\Esc . #\Esc)
                            (#\Backspace . #\Backspace)
                            (#\Tab . #\Tab)
                            (#\Newline . #\Newline)
                            (#\Space . #\Space)
                            (#\F1 . #\F1)
                            (#\F2 . #\F2)
                            (#\F3 . #\F3)
                            (#\F4 . #\F4)
                            (#\F5 . #\F5)
                            (#\F6 . #\F6)
                            (#\F7 . #\F7)
                            (#\F8 . #\F8)
                            (#\F9 . #\F9)
                            (#\F10 . #\F10)
                            (#\F11 . #\F11)
                            (#\F12 . #\F12)
                            (#\KP-0 . #\0)
                            (#\KP-1 . #\1)
                            (#\KP-2 . #\2)
                            (#\KP-3 . #\3)
                            (#\KP-4 . #\4)
                            (#\KP-5 . #\5)
                            (#\KP-6 . #\6)
                            (#\KP-7 . #\7)
                            (#\KP-8 . #\8)
                            (#\KP-9 . #\9)
                            (#\KP-Minus . #\-)
                            (#\KP-Plus . #\+)
                            (#\KP-Period . #\.)
                            (#\KP-Multiply . #\*)
                            (#\KP-Divide . #\\)
                            (#\KP-Enter . #\Newline)
                            (#\Menu . #\Menu)
                            (#\Insert . #\Insert)
                            (#\Home . #\Home)
                            (#\Page-Up . #\Page-Up)
                            (#\Delete . #\Delete)
                            (#\End . #\End)
                            (#\Page-Down . #\Page-Down)
                            (#\Up-Arrow . #\Up-Arrow)
                            (#\Left-Arrow . #\Left-Arrow)
                            (#\Down-Arrow . #\Down-Arrow)
                            (#\Right-Arrow . #\Right-Arrow))))

(defparameter *nobk-keymap*
  (make-instance 'simple-keymap
                 :name "No-BK"
                 :unshifted '((#\0 . #\0)
                              (#\1 . #\1)
                              (#\2 . #\2)
                              (#\3 . #\3)
                              (#\4 . #\4)
                              (#\5 . #\5)
                              (#\6 . #\6)
                              (#\7 . #\7)
                              (#\8 . #\8)
                              (#\9 . #\9)
                              (#\A . #\a)
                              (#\B . #\b)
                              (#\C . #\c)
                              (#\D . #\d)
                              (#\E . #\e)
                              (#\F . #\f)
                              (#\G . #\g)
                              (#\H . #\h)
                              (#\I . #\i)
                              (#\J . #\j)
                              (#\K . #\k)
                              (#\L . #\l)
                              (#\M . #\m)
                              (#\N . #\n)
                              (#\O . #\o)
                              (#\P . #\p)
                              (#\Q . #\q)
                              (#\R . #\r)
                              (#\S . #\s)
                              (#\T . #\t)
                              (#\U . #\u)
                              (#\V . #\v)
                              (#\W . #\w)
                              (#\X . #\x)
                              (#\Y . #\y)
                              (#\Z . #\z)
                              (#\- . #\+)
                              (#\= . #\\)
                              (#\[ . #\å)
                              (#\] . #\")
                              (#\; . #\ø)
                              (#\' . #\æ)
                              (#\` . #\|)
                              (#\# . #\')
                              (#\, . #\,)
                              (#\. . #\.)
                              (#\/ . #\-)
                              (#\\ . #\<)
                              (#\Esc . #\Esc)
                              (#\Backspace . #\Backspace)
                              (#\Tab . #\Tab)
                              (#\Newline . #\Newline)
                              (#\Space . #\Space)
                              (#\F1 . #\F1)
                              (#\F2 . #\F2)
                              (#\F3 . #\F3)
                              (#\F4 . #\F4)
                              (#\F5 . #\F5)
                              (#\F6 . #\F6)
                              (#\F7 . #\F7)
                              (#\F8 . #\F8)
                              (#\F9 . #\F9)
                              (#\F10 . #\F10)
                              (#\F11 . #\F11)
                              (#\F12 . #\F12)
                              (#\KP-0 . #\0)
                              (#\KP-1 . #\1)
                              (#\KP-2 . #\2)
                              (#\KP-3 . #\3)
                              (#\KP-4 . #\4)
                              (#\KP-5 . #\5)
                              (#\KP-6 . #\6)
                              (#\KP-7 . #\7)
                              (#\KP-8 . #\8)
                              (#\KP-9 . #\9)
                              (#\KP-Minus . #\-)
                              (#\KP-Plus . #\+)
                              (#\KP-Period . #\.)
                              (#\KP-Multiply . #\*)
                              (#\KP-Divide . #\\)
                              (#\KP-Enter . #\Newline)
                              (#\Menu . #\Menu)
                              (#\Insert . #\Insert)
                              (#\Home . #\Home)
                              (#\Page-Up . #\Page-Up)
                              (#\Delete . #\Delete)
                              (#\End . #\End)
                              (#\Page-Down . #\Page-Down)
                              (#\Up-Arrow . #\Up-Arrow)
                              (#\Left-Arrow . #\Left-Arrow)
                              (#\Down-Arrow . #\Down-Arrow)
                              (#\Right-Arrow . #\Right-Arrow))
                 :shifted '((#\0 . #\=)
                            (#\1 . #\!)
                            (#\2 . #\")
                            (#\3 . #\#)
                            (#\4 . #\¤)
                            (#\5 . #\%)
                            (#\6 . #\&)
                            (#\7 . #\/)
                            (#\8 . #\()
                            (#\9 . #\))
                            (#\A . #\A)
                            (#\B . #\B)
                            (#\C . #\C)
                            (#\D . #\D)
                            (#\E . #\E)
                            (#\F . #\F)
                            (#\G . #\G)
                            (#\H . #\H)
                            (#\I . #\I)
                            (#\J . #\J)
                            (#\K . #\K)
                            (#\L . #\L)
                            (#\M . #\M)
                            (#\N . #\N)
                            (#\O . #\O)
                            (#\P . #\P)
                            (#\Q . #\Q)
                            (#\R . #\R)
                            (#\S . #\S)
                            (#\T . #\T)
                            (#\U . #\U)
                            (#\V . #\V)
                            (#\W . #\W)
                            (#\X . #\X)
                            (#\Y . #\Y)
                            (#\Z . #\Z)
                            (#\- . #\?)
                            (#\= . #\`)
                            (#\[ . #\Å)
                            (#\] . #\^)
                            (#\; . #\Ø)
                            (#\' . #\Æ)
                            (#\` . #\§)
                            (#\# . #\*)
                            (#\, . #\;)
                            (#\. . #\:)
                            (#\/ . #\_)
                            (#\\ . #\>)
                            (#\Esc . #\Esc)
                            (#\Backspace . #\Backspace)
                            (#\Tab . #\Tab)
                            (#\Newline . #\Newline)
                            (#\Space . #\Space)
                            (#\F1 . #\F1)
                            (#\F2 . #\F2)
                            (#\F3 . #\F3)
                            (#\F4 . #\F4)
                            (#\F5 . #\F5)
                            (#\F6 . #\F6)
                            (#\F7 . #\F7)
                            (#\F8 . #\F8)
                            (#\F9 . #\F9)
                            (#\F10 . #\F10)
                            (#\F11 . #\F11)
                            (#\F12 . #\F12)
                            (#\KP-0 . #\0)
                            (#\KP-1 . #\1)
                            (#\KP-2 . #\2)
                            (#\KP-3 . #\3)
                            (#\KP-4 . #\4)
                            (#\KP-5 . #\5)
                            (#\KP-6 . #\6)
                            (#\KP-7 . #\7)
                            (#\KP-8 . #\8)
                            (#\KP-9 . #\9)
                            (#\KP-Minus . #\-)
                            (#\KP-Plus . #\+)
                            (#\KP-Period . #\.)
                            (#\KP-Multiply . #\*)
                            (#\KP-Divide . #\\)
                            (#\KP-Enter . #\Newline)
                            (#\Menu . #\Menu)
                            (#\Insert . #\Insert)
                            (#\Home . #\Home)
                            (#\Page-Up . #\Page-Up)
                            (#\Delete . #\Delete)
                            (#\End . #\End)
                            (#\Page-Down . #\Page-Down)
                            (#\Up-Arrow . #\Up-Arrow)
                            (#\Left-Arrow . #\Left-Arrow)
                            (#\Down-Arrow . #\Down-Arrow)
                            (#\Right-Arrow . #\Right-Arrow))
                 :shifted2 '((#\0 . #\})
                             (#\1 . #\¡)
                             (#\2 . #\@)
                             (#\3 . #\£)
                             (#\4 . #\$)
                             (#\5 . #\½)
                             (#\6 . #\¥)
                             (#\7 . #\{)
                             (#\8 . #\[)
                             (#\9 . #\])
                             (#\A . #\ª)
                             (#\B . #\”)
                             (#\C . #\©)
                             (#\D . #\ð)
                             (#\E . #\€)
                             (#\F . #\đ)
                             (#\G . #\ŋ)
                             (#\H . #\ħ)
                             (#\I . #\→)
                             (#\J . #\̉)
                             (#\K . #\ĸ)
                             (#\L . #\ł)
                             (#\M . #\µ)
                             (#\N . #\n)
                             (#\O . #\œ)
                             (#\P . #\π)
                             (#\Q . #\@)
                             (#\R . #\®)
                             (#\S . #\ß)
                             (#\T . #\þ)
                             (#\U . #\↓)
                             (#\V . #\“)
                             (#\W . #\ł)
                             (#\X . #\»)
                             (#\Y . #\←)
                             (#\Z . #\«)
                             (#\- . #\±)
                             (#\= . #\')
                             (#\[ . #\")
                             (#\] . #\~)
                             (#\; . #\')
                             (#\' . #\')
                             (#\` . #\¦)
                             (#\# . #\˝)
                             (#\, . #\¸)
                             (#\. . #\…)
                             (#\/ . #\–)
                             (#\\ . #\½))))

(defparameter *pancyr-keymap*
  (make-instance 'simple-keymap
                 :name "PanCyr"
                 :untranslated-modifiers t
                 :unshifted '((#\0 . #\0)
                              (#\1 . #\1)
                              (#\2 . #\2)
                              (#\3 . #\3)
                              (#\4 . #\4)
                              (#\5 . #\5)
                              (#\6 . #\6)
                              (#\7 . #\7)
                              (#\8 . #\8)
                              (#\9 . #\9)
                              (#\A . #\ф)
                              (#\B . #\и)
                              (#\C . #\с)
                              (#\D . #\в)
                              (#\E . #\у)
                              (#\F . #\а)
                              (#\G . #\п)
                              (#\H . #\р)
                              (#\I . #\ш)
                              (#\J . #\о)
                              (#\K . #\л)
                              (#\L . #\д)
                              (#\M . #\ь)
                              (#\N . #\т)
                              (#\O . #\щ)
                              (#\P . #\з)
                              (#\Q . #\й)
                              (#\R . #\к)
                              (#\S . #\ы)
                              (#\T . #\е)
                              (#\U . #\г)
                              (#\V . #\м)
                              (#\W . #\ц)
                              (#\X . #\ч)
                              (#\Y . #\н)
                              (#\Z . #\я)
                              (#\- . #\-)
                              (#\= . #\=)
                              (#\[ . #\х)
                              (#\] . #\ъ)
                              (#\; . #\ж)
                              (#\' . #\э)
                              (#\` . #\ё)
                              (#\# . #\\)
                              (#\, . #\б)
                              (#\. . #\ю)
                              (#\/ . #\.)
                              (#\\ . #\/)
                              (#\Esc . #\Esc)
                              (#\Backspace . #\Backspace)
                              (#\Tab . #\Tab)
                              (#\Newline . #\Newline)
                              (#\Space . #\Space)
                              (#\F1 . #\F1)
                              (#\F2 . #\F2)
                              (#\F3 . #\F3)
                              (#\F4 . #\F4)
                              (#\F5 . #\F5)
                              (#\F6 . #\F6)
                              (#\F7 . #\F7)
                              (#\F8 . #\F8)
                              (#\F9 . #\F9)
                              (#\F10 . #\F10)
                              (#\F11 . #\F11)
                              (#\F12 . #\F12)
                              (#\KP-0 . #\0)
                              (#\KP-1 . #\1)
                              (#\KP-2 . #\2)
                              (#\KP-3 . #\3)
                              (#\KP-4 . #\4)
                              (#\KP-5 . #\5)
                              (#\KP-6 . #\6)
                              (#\KP-7 . #\7)
                              (#\KP-8 . #\8)
                              (#\KP-9 . #\9)
                              (#\KP-Minus . #\-)
                              (#\KP-Plus . #\+)
                              (#\KP-Period . #\.)
                              (#\KP-Multiply . #\*)
                              (#\KP-Divide . #\\)
                              (#\KP-Enter . #\Newline)
                              (#\Menu . #\Menu)
                              (#\Insert . #\Insert)
                              (#\Home . #\Home)
                              (#\Page-Up . #\Page-Up)
                              (#\Delete . #\Delete)
                              (#\End . #\End)
                              (#\Page-Down . #\Page-Down)
                              (#\Up-Arrow . #\Up-Arrow)
                              (#\Left-Arrow . #\Left-Arrow)
                              (#\Down-Arrow . #\Down-Arrow)
                              (#\Right-Arrow . #\Right-Arrow))
                 :shifted '((#\0 . #\))
                            (#\1 . #\!)
                            (#\2 . #\")
                            (#\3 . #\№)
                            (#\4 . #\;)
                            (#\5 . #\%)
                            (#\6 . #\:)
                            (#\7 . #\?)
                            (#\8 . #\*)
                            (#\9 . #\()
                            (#\A . #\Ф)
                            (#\B . #\И)
                            (#\C . #\С)
                            (#\D . #\В)
                            (#\E . #\У)
                            (#\F . #\А)
                            (#\G . #\П)
                            (#\H . #\Р)
                            (#\I . #\Ш)
                            (#\J . #\О)
                            (#\K . #\Л)
                            (#\L . #\Д)
                            (#\M . #\Ь)
                            (#\N . #\Т)
                            (#\O . #\Щ)
                            (#\P . #\З)
                            (#\Q . #\Й)
                            (#\R . #\К)
                            (#\S . #\Ы)
                            (#\T . #\Е)
                            (#\U . #\Г)
                            (#\V . #\М)
                            (#\W . #\Ц)
                            (#\X . #\Ч)
                            (#\Y . #\Н)
                            (#\Z . #\Я)
                            (#\- . #\_)
                            (#\= . #\+)
                            (#\[ . #\Х)
                            (#\] . #\Ъ)
                            (#\; . #\Ж)
                            (#\' . #\Э)
                            (#\` . #\Ё)
                            (#\# . #\/)
                            (#\, . #\Б)
                            (#\. . #\Ю)
                            (#\/ . #\,)
                            (#\\ . #\|)
                            (#\Esc . #\Esc)
                            (#\Backspace . #\Backspace)
                            (#\Tab . #\Tab)
                            (#\Newline . #\Newline)
                            (#\Space . #\Space)
                            (#\F1 . #\F1)
                            (#\F2 . #\F2)
                            (#\F3 . #\F3)
                            (#\F4 . #\F4)
                            (#\F5 . #\F5)
                            (#\F6 . #\F6)
                            (#\F7 . #\F7)
                            (#\F8 . #\F8)
                            (#\F9 . #\F9)
                            (#\F10 . #\F10)
                            (#\F11 . #\F11)
                            (#\F12 . #\F12)
                            (#\KP-0 . #\0)
                            (#\KP-1 . #\1)
                            (#\KP-2 . #\2)
                            (#\KP-3 . #\3)
                            (#\KP-4 . #\4)
                            (#\KP-5 . #\5)
                            (#\KP-6 . #\6)
                            (#\KP-7 . #\7)
                            (#\KP-8 . #\8)
                            (#\KP-9 . #\9)
                            (#\KP-Minus . #\-)
                            (#\KP-Plus . #\+)
                            (#\KP-Period . #\.)
                            (#\KP-Multiply . #\*)
                            (#\KP-Divide . #\\)
                            (#\KP-Enter . #\Newline)
                            (#\Menu . #\Menu)
                            (#\Insert . #\Insert)
                            (#\Home . #\Home)
                            (#\Page-Up . #\Page-Up)
                            (#\Delete . #\Delete)
                            (#\End . #\End)
                            (#\Page-Down . #\Page-Down)
                            (#\Up-Arrow . #\Up-Arrow)
                            (#\Left-Arrow . #\Left-Arrow)
                            (#\Down-Arrow . #\Down-Arrow)
                            (#\Right-Arrow . #\Right-Arrow))
                 :shifted2 '((#\E . #\ў)
                             (#\I . #\і)
                             (#\T . #\є)
                             (#\Q . #\ї)
                             (#\U . #\ґ))))
